/* * Copyright 2011 Uwe Krueger. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mandelsoft.swing; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JViewport; import com.mandelsoft.swing.BufferedComponent.RectPointEventListener; import com.mandelsoft.swing.BufferedComponent.RectEventListener; import com.mandelsoft.swing.BufferedComponent.RectModifiedEventListener; import com.mandelsoft.swing.BufferedComponent.RectangleSelector; import com.mandelsoft.swing.BufferedComponent.VisibleRect; /** * * @author Uwe Krueger */ public class BufferedFrame extends JFrame { static public boolean debug=false; static public final int FRAME_INSETS= 5; private BufferedComponent buffer; private JScrollPane scrollpane; private boolean partial=false; public BufferedFrame() { this(new BufferedComponent()); } public BufferedFrame(int width, int height) { this(new BufferedComponent(width, height)); } public BufferedFrame(BufferedComponent c) { buffer=c; scrollpane=new JScrollPane(c); scrollpane.setBorder(null); add(scrollpane); pack(); c.setLimitWindowSize(true); scrollpane.getViewport().addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { //System.out.println("RS: "+e); JViewport vp=scrollpane.getViewport(); if (vp!=null) { if (debug) System.out.println("PREF:"+buffer.getPreferredSize()); if (debug) System.out.println("VP: "+vp.getViewPosition()); if (debug) System.out.println("VP: "+vp.getExtentSize()); partial=!buffer.getPreferredSize().equals(vp.getExtentSize()); } else partial=false; } }); } public BufferedFrame(BufferedImage image) { this(new BufferedComponent(image)); } public boolean isPartial() { return partial; } public BufferedComponent getImagePane() { return buffer; } public JScrollPane getScrollPane() { return scrollpane; } public void setInitialSize() { Dimension id=buffer.getPreferredSize(); Dimension sd=Toolkit.getDefaultToolkit().getScreenSize(); Dimension d=new Dimension(id); Insets insets=getInsets(); Dimensions.mod.add(d,insets.left+insets.right,insets.top+insets.bottom); Dimensions.mod.sub(sd,FRAME_INSETS,FRAME_INSETS); Dimensions.mod.limit(d,sd); setSize(d); } public void setImage(BufferedImage image) { if (debug) System.out.println("image to buffer"); buffer.setImage(image); buffer.setScale(1); if (debug) System.out.println("image buffer set"); } public void setComponentPopupMenu(JPopupMenu menu) { buffer.setComponentPopupMenu(menu); } public void showAllRects() { buffer.showAllRects(); } public VisibleRect createRect(String name, Object o) { return buffer.createRect(name, o); } public void setSelectInvisible(boolean b) { buffer.setSelectInvisible(b); } public void setRectangleSelector(RectangleSelector s) { buffer.setRectangleSelector(s); } public void setLimitWindowSize(boolean b) { buffer.setLimitWindowSize(b); } public void removeRectModifiedEventListener(RectModifiedEventListener l) { buffer.removeRectModifiedEventListener(l); } public void removeRectEventListener(RectEventListener l) { buffer.removeRectEventListener(l); } public void removeCornerEventListener(RectPointEventListener l) { buffer.removeRectPointEventListener(l); } public void removeActionListener(ActionListener l, Corner c) { buffer.removeActionListener(l, c); } public void discardAllRects() { buffer.discardAllRects(); } public void addRectModifiedEventListener(RectModifiedEventListener l) { buffer.addRectModifiedEventListener(l); } public void addRectEventListener(RectEventListener l) { buffer.addRectEventListener(l); } public void addCornerEventListener(RectPointEventListener l) { buffer.addRectPointEventListener(l); } public void addActionListener(ActionListener l, Corner c) { buffer.addActionListener(l, c); } public Graphics2D createGraphics() { return buffer.createGraphics(); } public void revalidate() { buffer.revalidate(); } public int translateY(MouseEvent e) { return buffer.translateY(e); } public int translateY(int y) { return buffer.translateY(y); } public int translateX(MouseEvent e) { return buffer.translateX(e); } public int translateX(int x) { return buffer.translateX(x); } public MouseEvent translate(MouseEvent e) { return buffer.translate(e); } private List<RenewStateListener> listeners=new ArrayList<RenewStateListener>(); public void addRenewStateListener(RenewStateListener l) { listeners.add(l); } public void removeRenewStateListener(RenewStateListener l) { listeners.remove(l); } protected void fireRenewState() { for (RenewStateListener l:listeners) { try { l.renewState(this); } catch (Exception e) { e.printStackTrace(System.err); } } } }